//package com.hzeport.bgs22emduty.config;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.hzeport.bgs22emduty.dto.DutyScheduleInfoTimeDTO;
//import com.hzeport.bgs22emduty.entity.BaseDeptInfo;
//import com.hzeport.bgs22emduty.entity.ParamSmsTemplate;
//import com.hzeport.bgs22emduty.entity.ScreenMessage;
//import com.hzeport.bgs22emduty.entity.ScreenMessageDistribute;
//import com.hzeport.bgs22emduty.enums.SmsEnum;
//import com.hzeport.bgs22emduty.outbound.BaseDeptInfoRepository;
//import com.hzeport.bgs22emduty.outbound.ParamSmsTemplateRepository;
//import com.hzeport.bgs22emduty.outbound.ScreenMessageRepository;
//import com.hzeport.bgs22emduty.service.DutyScheduleInfoService;
//import com.hzeport.bgs22emduty.util.MessageSendUtil;
//import com.hzeport.bgs22emduty.common.base.BaseResult;
//import lombok.extern.slf4j.Slf4j;
//import org.springframework.stereotype.Component;
//import org.springframework.util.CollectionUtils;
//import org.springframework.util.StringUtils;
//
//import javax.annotation.Resource;
//import javax.websocket.*;
//import javax.websocket.server.PathParam;
//import javax.websocket.server.ServerEndpoint;
//import java.io.IOException;
//import java.util.List;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * websocket的处理类。
// * 作用相当于HTTP请求
// * 中的controller
// */
//@Component
//@Slf4j
//@ServerEndpoint("/api/pushMessage/{userId}")
//public class WebSocketServer {
//
//    /**静态变量，用来记录当前在线连接数。应该把它设计成线程安全的。*/
//    private static int onlineCount = 0;
//    /**concurrent包的线程安全Set，用来存放每个客户端对应的WebSocket对象。*/
//    private static ConcurrentHashMap<String,WebSocketServer> webSocketMap = new ConcurrentHashMap<>();
//    /**与某个客户端的连接会话，需要通过它来给客户端发送数据*/
//    private Session session;
//    /**接收userId*/
//    private String userId = "";
//    @Resource
//    private ScreenMessageRepository screenMessageRepository;
//    @Resource
//    private BaseDeptInfoRepository baseDeptInfoRepository;
//    @Resource
//    private DutyScheduleInfoService dutyScheduleInfoService;
//    @Resource
//    private ParamSmsTemplateRepository paramSmsTemplateRepository;
//    @Resource
//    private MessageSendUtil messageSendUtil;
//    @Resource
//    private SystemConfig systemConfig;
//    /**
//     * 连接建立成
//     * 功调用的方法
//     */
//    @OnOpen
//    public void onOpen(Session session,@PathParam("userId") String userId) {
//        this.session = session;
//        this.userId=userId;
//        if(webSocketMap.containsKey(userId)){
//            webSocketMap.remove(userId);
//            //加入set中
//            webSocketMap.put(userId,this);
//        }else{
//            //加入set中
//            webSocketMap.put(userId,this);
//            //在线数加1
//            addOnlineCount();
//        }
//        log.info("用户连接:"+userId+",当前在线人数为:" + getOnlineCount());
//        sendMessage("连接成功");
//    }
//
//    /**
//     * 连接关闭
//     * 调用的方法
//     */
//    @OnClose
//    public void onClose() {
//        if(webSocketMap.containsKey(userId)){
//            webSocketMap.remove(userId);
//            //从set中删除
//            subOnlineCount();
//        }
//        log.info("用户退出:"+userId+",当前在线人数为:" + getOnlineCount());
//    }
//
//    /**
//     * 收到客户端消
//     * 息后调用的方法
//     * @param message
//     * 客户端发送过来的消息
//     **/
//    @OnMessage
//    public void onMessage(String message, Session session) {
//        log.info("用户消息:"+userId+",报文:"+message);
//        //可以群发消息
//        //消息保存到数据库、redis
//        if(!StringUtils.isEmpty(message)){
//            try {
//                //解析发送的报文
//                JSONObject jsonObject = JSON.parseObject(message);
//                //追加发送人(防止串改)
//                jsonObject.put("fromUserId",this.userId);
//                String toUserId=jsonObject.getString("toUserId");
//                //传送给对应toUserId用户的websocket
//                if(!StringUtils.isEmpty(toUserId)&&webSocketMap.containsKey(toUserId)){
//                    webSocketMap.get(toUserId).sendMessage(message);
//                }else{
//                    //否则不在这个服务器上，发送到mysql或者redis
//                    log.error("请求的userId:"+toUserId+"不在该服务器上");
//                }
//            }catch (Exception e){
//                e.printStackTrace();
//            }
//        }
//    }
//
//
//    /**
//     * @param session
//     * @param error
//     */
//    @OnError
//    public void onError(Session session, Throwable error) {
//
//        log.error("用户错误:"+this.userId+",原因:"+error.getMessage());
//        error.printStackTrace();
//    }
//
//    /**
//     * 实现服务
//     * 器主动推送
//     */
//    public void sendMessage(String message) {
//        try {
//            this.session.getBasicRemote().sendText(message);
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//    }
//
//    /**
//     *发送自定
//     *义消息
//     **/
//    public static void sendInfo(String message, String userId) {
//        log.info("发送消息到:"+userId+"，报文:"+message);
//        if(!StringUtils.isEmpty(userId) && webSocketMap.containsKey(userId)){
//            webSocketMap.get(userId).sendMessage(message);
//        }else{
//            log.error("用户"+userId+",不在线！");
//        }
//    }
//
//    public static void sendAll(String message) {
//      for (String key:webSocketMap.keySet()){
//          sendInfo(message,key);
//      }
//    }
//
//    /**
//     * 获得此时的
//     * 在线人数
//     * @return
//     */
//    public static synchronized int getOnlineCount() {
//        return onlineCount;
//    }
//
//    /**
//     * 在线人
//     * 数加1
//     */
//    public static synchronized void addOnlineCount() {
//        WebSocketServer.onlineCount++;
//    }
//
//    /**
//     * 在线人
//     * 数减1
//     */
//    public static synchronized void subOnlineCount() {
//        WebSocketServer.onlineCount--;
//    }
//
//    public void sendAllHZ(String message,ScreenMessage screenMessage) {
//        if (screenMessage!=null) {
//            screenMessage.setSendTarget("HZ");
//            screenMessage.setDelFlag("0");
//            screenMessageRepository.save(screenMessage);
//        }
//        for (String key:webSocketMap.keySet()){
//            if (key.contains("HZ")) {
//                sendInfo(message, key);
//            }
//        }
//        List<ParamSmsTemplate> paramSmsTemplates=paramSmsTemplateRepository.list(new LambdaQueryWrapper<ParamSmsTemplate>()
//                .eq(ParamSmsTemplate::getTemplateName,systemConfig.getZsCustomName())
//                .eq(ParamSmsTemplate::getIsSend, "1")
//                .eq(ParamSmsTemplate::getSmsType, SmsEnum.TYPE_MESSAGE_UP.getCode()));
//        if (!CollectionUtils.isEmpty(paramSmsTemplates)) {
//            for (ParamSmsTemplate paramSmsTemplate:paramSmsTemplates) {
//                BaseResult<DutyScheduleInfoTimeDTO> dutyScheduleInfoTimeDTOBaseResult =
//                        dutyScheduleInfoService.nowUser(systemConfig.getZsCustomName());
//                if (dutyScheduleInfoTimeDTOBaseResult != null && dutyScheduleInfoTimeDTOBaseResult.getData() != null &&
//                        dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo() != null
//                        && dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo().getDPhone() != null) {
//                    messageSendUtil.sendMessage(dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo().getDPhone(),screenMessage.getCustomName()+"上报,"+ paramSmsTemplate.getRemark());
//                }
//            }
//        }
//    }
//    public void sendAllZS(String message,ScreenMessage screenMessage) {
//        if (screenMessage!=null) {
//            screenMessage.setSendTarget("ZS");
//            screenMessage.setDelFlag("0");
//            screenMessageRepository.save(screenMessage);
//        }
//        for (String key:webSocketMap.keySet()){
//            if (key.contains("ZS")) {
//                sendInfo(message, key);
//            }
//        }
//    }
//
//    public void sendAllDistribute(String message, ScreenMessageDistribute screenMessageDistribute) {
//        ScreenMessage screenMessage=new ScreenMessage();
//        String customIds=screenMessageDistribute.getCustomId();
//        String temp[]=customIds.split("\\|");
//        for (String customId:temp){
//            BaseDeptInfo custom=baseDeptInfoRepository.getById(customId);
//            if (custom!=null) {
//                screenMessage.setCustomCode(custom.getId());
//                screenMessage.setCustomName(custom.getDeptName());
//                screenMessage.setRId(screenMessageDistribute.getId());
//                screenMessage.setMessage(screenMessageDistribute.getTitle());
//                if (screenMessageDistribute != null) {
//                    screenMessage.setSendTarget("ZS");
//                    screenMessage.setDelFlag("0");
//                    screenMessage.setMainBody(screenMessageDistribute.getMainBody());
//                    screenMessage.setId(null);
//                    screenMessageRepository.save(screenMessage);
//                }
//                for (String key : webSocketMap.keySet()) {
//                    if (key.contains(custom.getId())) {
//                        sendInfo(message, key);
//                    }
//                }
//                List<ParamSmsTemplate> paramSmsTemplates=paramSmsTemplateRepository.list(new LambdaQueryWrapper<ParamSmsTemplate>()
//                .eq(ParamSmsTemplate::getTemplateCode,custom.getId())
//                        .eq(ParamSmsTemplate::getIsSend, "1")
//                        .eq(ParamSmsTemplate::getSmsType, SmsEnum.TYPE_MESSAGE_DOWN.getCode()));
//                if (!CollectionUtils.isEmpty(paramSmsTemplates)) {
//                    for (ParamSmsTemplate paramSmsTemplate:paramSmsTemplates) {
//                        BaseResult<DutyScheduleInfoTimeDTO> dutyScheduleInfoTimeDTOBaseResult =
//                                dutyScheduleInfoService.nowUser(custom.getDeptName());
//                        if (dutyScheduleInfoTimeDTOBaseResult != null && dutyScheduleInfoTimeDTOBaseResult.getData() != null &&
//                                dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo() != null
//                                && dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo().getDPhone() != null) {
//                            messageSendUtil.sendMessage(dutyScheduleInfoTimeDTOBaseResult.getData().getKJInfo().getDPhone(), paramSmsTemplate.getRemark());
//                        }
//                    }
//                }
//            }
//        }
//    }
//}
//
//
